﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLCLientes
    /// </summary>
    class BLIMPLClientes:Presupuesto_BL.BLClientes
    {
        DAOClientes createCliente = DAOFactoryPresupuesto.createCliente();

        /// <summary>
        /// Guarda un cliente
        /// </summary>
        /// <param name="c">Objeto que tiene los datos del cliente a guardar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveCliente(clientesDTO c)
        {
            Boolean correcto = false;

            try
            {
                Boolean insertado = createCliente.saveCliente(c.Nombre, c.Direccion, c.Contacto, c.Mail, c.Cuit, c.Activo);

                if (insertado)
                {
                    correcto = true;
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un cliente
        /// </summary>
        /// <param name="c">Objeto con los datos del cliente a modificar</param>
        /// <param name="nombre">Determina el cliente a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateCliente(clientesDTO c, string nombre)
        {
            Boolean correcto = false;

            try
            {
                clientes cli = createCliente.getCliente(nombre);

                if (null != cli)
                {
                    Boolean modificado = createCliente.updateCliente(c.Nombre, c.Direccion, c.Contacto, c.Mail, c.Cuit, c.Activo, cli.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Elimina un cliente
        /// </summary>
        /// <param name="nombre">Determina el cliente a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteCliente(string nombre)
        {
            Boolean correcto = false;

            try
            {
                Boolean borrado = createCliente.deleteCliente(nombre);

                if (borrado)
                {
                    correcto = true;                   
                }
 
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Lista de Clientes
        /// </summary>
        /// <returns>Devuelve una tabla con los clientes</returns>
        public DataTable getAllClientes()
        {
            DataTable listadoClientes = null;

            try
            {
                DataTable clientes = createCliente.getAllClientes();

                if (null != clientes)
                {
                    listadoClientes = clientes;
                }
            }
            catch (Exception ex) 
            {

                listadoClientes = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoClientes;
        }

        /// <summary>
        /// Obtiene un cliente
        /// </summary>
        /// <param name="nombre">Determina el cliente a obtener</param>
        /// <returns>Devuelve un objeto cliente</returns>
        public clientesDTO getCliente(string nombre)
        {
            clientesDTO cliente = null;

            try
            {
                clientes cli = createCliente.getCliente(nombre);

                if (null != cli)
                {
                    cliente = new clientesDTO();
                    cliente.Activo = cli.Activo;
                    cliente.Contacto = cli.Contacto;
                    cliente.Cuit = cli.Cuit;
                    cliente.Direccion = cli.Direccion;
                    cliente.ID = cli.ID;
                    cliente.Mail = cli.Mail;
                    cliente.Nombre = cli.Nombre;
                }
            }
            catch (Exception ex)
            {

                cliente = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return cliente;
        }
    }
}